/**
 * 基于链表实现栈
 * 将头节点视为栈顶，尾节点视为栈底
 */

#include "stack.h"

Stack *init_stack() // 初始化空栈
{
  Stack *stack;
  stack = (Stack *)malloc(sizeof(Stack)); // 分配内存
  stack->size = 0; // 长度初始化为0
  stack->top = NULL; // 此时为空栈，栈顶为NULL
}

int get_length(Stack *stack) // 获取长度
{
  return stack->size;
}

bool is_empty(Stack *stack) // 判断是否是空栈
{
  if (stack->top) return false;
  else return true;
}

void push(Stack *stack, int value) // 入栈
{
  Node *head = init_linked_list_node(value);
  stack->size++;
  head->next = stack->top;
  stack->top = head;
}

int peek(Stack *stack) // 访问栈顶的值
{
  return stack->top->value;
}

int pop(Stack *stack) // 出栈
{
  Node *head = stack->top;
  int val = head->value;
  stack->top = head->next;
  stack->size--;
  free(head);
  return val;
}

void print_stack(Stack *stack) // 打印栈
{
  puts("From top to bottom:");
  print_linked_list(stack->top);
}

void destory_stack(Stack *stack) // 销毁栈
{
  destory_linked_list(stack->top);
  free(stack);
}